package com.yj.springbootmybatis.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 用来记录业务层处理的时间
 */
@Component
@Aspect
@Slf4j
public class ServiceAopAspect {

    /**
     *  通知的类型：
     *      1、前置通知： 方法执行之前执行
     *      2、后置通知： 方法正常执行之后执行
     *      3、环绕通知： 方法执行的前后执行
     *      4、异常通知： 方法执行异常后执行
     *      5、最终通知： 方法执行之后执行
     */


    /**
     * 切面表达式：
     *  execution 代表所要执行的表达式主体
     *  第一处：*   代表方法的返回类型，* 代表所有类型
     *  第二处：包名 代表AOP监控的类所在的包
     *  第三处：..  代表多个层级，包下的以及子包下的
     *  第四处：*   代表类名，表示任意类
     *  第五处：*   代表方法名，表示任意方法
     *  第六处：(..) 代表方法参数，表示多个参数
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around(value = "execution(* com.yj.springbootmybatis.service..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

      log.info("=====开始执行：{}.{}=====",
              joinPoint.getTarget().getClass(), //目标方法的类
              joinPoint.getSignature().getName());//目标方法签名的名称

        // 记录开始时间
        long beginTime = System.currentTimeMillis();

        // 方法执行
        Object proceed = joinPoint.proceed();

        // 记录结束时间
        long endTime = System.currentTimeMillis();

        // takeTime
        long takeTime = endTime - beginTime;
        log.info("===== 执行结束，耗时：{} 毫秒 =====",takeTime);
        return proceed;
    }


}
